package com.divemotor.ventarepuestosinternet.service.impl;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Properties;

import org.jboss.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.divemotor.ventarepuestosinternet.dao.ImagenDAO;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Imagen;
import com.divemotor.ventarepuestosinternet.model.Marca;
import com.divemotor.ventarepuestosinternet.model.ModeloFabrica;
import com.divemotor.ventarepuestosinternet.model.SubGrupo;
import com.divemotor.ventarepuestosinternet.model.TipoComponente;
import com.divemotor.ventarepuestosinternet.model.Vehiculo;
import com.divemotor.ventarepuestosinternet.service.ImagenService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;
import com.divemotor.ventarepuestosinternet.util.FechasUtil;

@Service(value = "imagenService")
@Transactional(rollbackFor=Exception.class)
public class ImagenServiceImpl implements ImagenService, Serializable {

	private static final Logger logger = Logger.getLogger(ImagenServiceImpl.class);
	
	private static final long serialVersionUID = 1L;
	
	private Properties propiedades;
	
	private String rutaImagenes;
	
	@Autowired
	private ImagenDAO imagenDAO;
	
	public ImagenServiceImpl() {
		logger.info("ImagenServiceImpl");
		this.propiedades = new Properties();
		try {
			this.propiedades.load(ImagenServiceImpl.class.getResourceAsStream("/directorios.properties"));
			//TODO INYECTAR DESDE XML DE SPRING
			this.rutaImagenes = this.propiedades.getProperty("rutaImagenes");
		} catch (IOException e) {
			logger.error("EX* ImagenServiceImpl: " + e.getMessage());
		}
	}
	
	@Override
	public List<Imagen> listarImagenesPorSubGrupo(SubGrupo subGrupo) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		return imagenDAO.listarImagenesPorSubGrupo(imagen);
	}

	@Override
	public List<Imagen> listarImagenesPorSubGrupoYModeloFabrica(SubGrupo subGrupo, ModeloFabrica modeloFabrica) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		imagen.setModeloFabrica(modeloFabrica);
		return imagenDAO.listarImagenesPorSubGrupoYModeloFabrica(imagen);
	}
	
	@Override
	public String obtenerRutaImagenes() throws DivemotorBusinessException {
		return this.rutaImagenes;
	}

	@Override
	public void insertar(Imagen imagen) {
		imagen.setEstado(Constantes.ESTADO_ACTIVO);
		imagen.setUsuarioCreacion(DatosDeSession.obtenerUsuarioAutenticado());
		imagen.setFechaCreacion(FechasUtil.obtenerFechaActual());
		
		try {
			if (imagen.getNombreArchivo().substring(imagen.getNombreArchivo().length() - 3).toUpperCase().equals("PDF")) {
				imagen.setTipo(Constantes.CODIGO_TIPO_PDF);
			} else {
				imagen.setTipo(Constantes.CODIGO_TIPO_IMG);
			}
			imagen.setNombreArchivo(null);
			
			imagenDAO.insertar(imagen);
			if(imagen.getTipo().equals(Constantes.CODIGO_TIPO_IMG)){
				imagen.setNombreArchivo(imagen.getIdImagen()+".jpg");
			}else{
				imagen.setNombreArchivo(imagen.getIdImagen()+".pdf");
			}
			String nombreArchivo = imagen.getNombreArchivo();
			File file =new File(this.rutaImagenes, nombreArchivo);
			
			OutputStream archivoFinal = new FileOutputStream(file);

			int read = 0;
			byte[] bytes = new byte[1024];

			while ((read = imagen.getArchivo().read(bytes)) != -1) {
				archivoFinal.write(bytes, 0, read);
			}

			imagen.getArchivo().close();
			archivoFinal.flush();
			archivoFinal.close();
			imagenDAO.actualizar(imagen);
		} catch (Exception e) {
			logger.error("EX* insertar: " + e.getMessage());
		}
	}

	@Override
	public String obtenerSiguienteNombreImagen(String tipo) {
		String maximoNombreImagen = imagenDAO.obtenerMaximoNombreImagen().substring(0, 7);
		int numeroMaximo = Integer.parseInt(maximoNombreImagen);
		String siguienteNombre = Integer.toString(numeroMaximo + 1);
		while (siguienteNombre.length() < 7) {
			siguienteNombre = "0" + siguienteNombre;
		}
		siguienteNombre = siguienteNombre + "." + (tipo.equals(Constantes.CODIGO_TIPO_PDF) ? "pdf" : "jpg" ) ;
		return siguienteNombre;
	}

	@Override
	public Integer obtenerSiguientePosicionPorSubGrupoYModeloFabrica(Imagen imagen) throws DivemotorBusinessException {
		List<Imagen> listaImagenes = listarImagenesPorSubGrupoYModeloFabrica(imagen.getSubGrupo(), imagen.getModeloFabrica());
		if (listaImagenes == null || listaImagenes.size() == 0) {
			return new Integer(1);
		} else {
			return listaImagenes.get(listaImagenes.size() - 1).getOrden() + 1;
		}
		
	}

	@Override
	public void eliminarImagen(Imagen imagen) throws DivemotorBusinessException {
		imagen.setEstado(Constantes.ESTADO_ELIMINADO);
		imagen.setUsuarioEliminacion(DatosDeSession.obtenerUsuarioAutenticado());
		imagen.setFechaEliminacion(FechasUtil.obtenerFechaActual());
		imagenDAO.actualizar(imagen); 
	}

	@Override
	public List<Imagen> listarImagenesPorSubGrupoYTipoComponente(SubGrupo subGrupo, TipoComponente tipoComponente) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		ModeloFabrica modeloFabrica = new ModeloFabrica();
		modeloFabrica.setTipoComponente(tipoComponente);
		imagen.setModeloFabrica(modeloFabrica);
		return imagenDAO.listarImagenesPorSubGrupoYTipoComponente(imagen);
	}

	@Override
	public List<Imagen> listarImagenesPorMarcaSubGrupoYTipoComponente(Marca marca, SubGrupo subGrupo, TipoComponente tipoComponente) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		ModeloFabrica modeloFabrica = new ModeloFabrica();
		modeloFabrica.setTipoComponente(tipoComponente);
		modeloFabrica.setMarca(marca);
		imagen.setModeloFabrica(modeloFabrica);
		return imagenDAO.listarImagenesPorMarcaSubGrupoYTipoComponente(imagen);
	}
	
	@Override
	public List<Imagen> listarImagenesPorMarcaSubGrupoYTipoComponenteYVehiculo(Marca marca, SubGrupo subGrupo, TipoComponente tipoComponente, Vehiculo vehiculo) throws DivemotorBusinessException {
		Imagen imagen = new Imagen();
		imagen.setSubGrupo(subGrupo);
		ModeloFabrica modeloFabrica = new ModeloFabrica();
		modeloFabrica.setTipoComponente(tipoComponente);
		modeloFabrica.setMarca(marca);
		imagen.setModeloFabrica(modeloFabrica);
		return imagenDAO.listarImagenesPorMarcaSubGrupoYTipoComponenteYVehiculo(imagen, vehiculo);
	}

	@Override
	public void editarImagen(Imagen imagen) throws DivemotorBusinessException {
		imagen.setUsuarioModificacion(DatosDeSession.obtenerUsuarioAutenticado());
		imagen.setFechaModificacion(FechasUtil.obtenerFechaActual());
		imagenDAO.actualizar(imagen);
	}

}
